using Admin.Application.Common;
using Admin.Application.Dto;
using Admin.Application.Dto.User;

namespace Admin.Application.Repositories
{
    /// <summary>
    /// 用户服务接口，定义了用户相关的业务操作。
    /// </summary>
    public interface IUserService
    {
        /// <summary>
        /// 异步删除用户。
        /// </summary>
        /// <param name="userId">要删除的用户的ID。</param>
        /// <returns>一个包含操作结果的 Task 对象，成功时返回 Result<string>; 类型的成功消息，失败时返回错误消息。</returns>
        Task<Result<string>> DeleteUserAsync(Guid userId);

        /// <summary>
        /// 异步更新用户信息。
        /// </summary>
        /// <param name="userId">要更新的用户的ID。</param>
        /// <param name="userInfoDto">包含更新信息的用户数据传输对象（DTO）。</param>
        /// <returns>一个包含操作结果的 Task 对象，成功时返回 Result<string>; 类型的成功消息，失败时返回错误消息。</returns>
        Task<Result<string>> UpdateUserInfoAsync(Guid userId, UserInfoDto userInfoDto);

        /// <summary>
        /// 异步更新用户启用状态。
        /// </summary>
        /// <param name="userId">要更新的用户的ID。</param>
        /// <param name="ActiveDto">包含更新信息的用户数据传输对象（DTO）。</param>
        /// <returns>一个包含操作结果的 Task 对象，成功时返回 Result<string>; 类型的成功消息，失败时返回错误消息。</returns>
        Task<Result<string>> UpdateIsActive(Guid userId, ActiveDto activeDto);

        /// <summary>
        /// 异步更新用户密码。
        /// </summary>
        /// <param name="userId">要更新密码的用户的ID。</param>
        /// <param name="userPwdDto">包含用户密码的用户数据传输对象（DTO）。</param>
        /// <returns>一个包含操作结果的 Task 对象，成功时返回 Result<string>; 类型的成功消息，失败时返回错误消息。</returns>
        Task<Result<string>> UpdateUserPwdAsync(Guid userId, UserPwdDto userPwdDto);

        /// <summary>
        /// 异步更新用户部门ID。
        /// </summary>
        /// <param name="userId">要更新密码的用户的ID。</param>
        /// <param name="DepartmentId">更改的部门ID</param>
        /// <returns>一个包含操作结果的 Task 对象，成功时返回 Result<string>; 类型的成功消息，失败时返回错误消息。</returns>
        Task<Result<string>> UpdateUserDepartmentIdAsync(Guid userId, Guid? departmentId);

        /// <summary>
        /// 异步获取分页用户列表。
        /// </summary>
        /// <param name="pageIndex">页码。</param>
        /// <param name="pageSize">每页大小。</param>
        /// <returns>一个包含分页用户列表结果的 Task 对象，成功时返回 Result<List<ResUserDto>>; 类型的成功消息，失败时返回错误消息。</returns>
        Task<Result<List<ResUserDto>>> GetPagedUserAsync(int pageIndex, int pageSize);

        /// <summary>
        /// 异步通过ID获取用户信息。
        /// </summary>
        /// <param name="userId">用户的ID。</param>
        /// <returns>一个包含用户信息结果的 Task 对象，成功时返回 Result<ResUserDto?>; 类型的成功消息，失败时返回错误消息。</returns>
        Task<Result<ResUserDto?>> GetUserByIdAsync(Guid userId);

        /// <summary>
        /// 异步给用户分配角色。
        /// </summary>
        /// <param name="userId">要分配角色的用户的ID。</param>
        /// <param name="roleId">要分配的角色ID</param>
        /// <returns>一个包含操作结果的 Task 对象，成功时返回 Result<string>; 类型的成功消息，失败时返回错误消息。</returns>
        Task<Result<string>> AssignRolesToUserAsync(Guid userId, Guid roleId);

        /// <summary>
        /// 异步从用户中移除角色。
        /// </summary>
        /// <param name="userId">要从中移除角色的用户的ID。</param>
        /// <param name="roleId">要移除的角色ID</param>
        /// <returns>一个包含操作结果的 Task 对象，成功时返回 Result<string>; 类型的成功消息，失败时返回错误消息。</returns>
        Task<Result<string>> RemoveRolesFromUserAsync(Guid userId, Guid roleId);
    }
}